#ifndef MONITOR_H
#define MONITOR_H

#include <QDeclarativeItem>
#include <QTimer>
#include <QQueue>
#include <QPen>
#include <QFont>
#include <QColor>
#include <QPainter>
#include <QPixmap>
#include <QDebug>

#include <QAbstractListModel>
#include <QStringList>
#include <QVariant>

#include <QDeclarativeView>

#include "gettraff.h"
#include "utils.h"
#include "qnmsettings.h"

#include "ifaceItemModel.h"
#include "ifaceListModel.h"


class CfgMonitor : public QObject
{
    Q_OBJECT

    QString ifaceMonitor;
    QStringList listIfaces;

    QObject *parent;

public:
    explicit CfgMonitor( QObject *parent, QNMSettings * qset);
    void initListIfaces();
};

/**********************************************************************************************************/

class Monitor : public QDeclarativeItem
{
    Q_OBJECT
    Q_PROPERTY( int height READ getHeight WRITE setHeight NOTIFY changeHeight )
    Q_PROPERTY( int width READ getWidth WRITE setWidth NOTIFY changeWidth )

    Q_PROPERTY( bool isWork READ getStatusTimer WRITE setStatusTimer NOTIFY changeStatusMonitor )

    Q_PROPERTY( QString speedRX READ getSpeedRX WRITE setSpeedRX NOTIFY changeValueParam )
    Q_PROPERTY( QString speedTX READ getSpeedTX WRITE setSpeedTX NOTIFY changeValueParam )
    Q_PROPERTY( QString traffRX READ getTraffRX WRITE setTraffRX NOTIFY changeValueParam )
    Q_PROPERTY( QString traffTX READ getTraffTX WRITE setTraffTX NOTIFY changeValueParam )

    Q_PROPERTY( int typeGraph READ getTypeGraph WRITE setTypeGraph NOTIFY changeSettings )
    Q_PROPERTY( bool showRX READ getShowRX WRITE setShowRX NOTIFY changeSettings )
    Q_PROPERTY( bool showTX READ getShowTX WRITE setShowTX NOTIFY changeSettings )
    Q_PROPERTY( int timestamp READ getTimestamp WRITE setTimestamp NOTIFY changeSettings )
    Q_PROPERTY( int refresh READ getRefreshInt WRITE setRefreshInt NOTIFY changeSettings )
    Q_PROPERTY( QString ifaceMonitor READ getIfaceMonitor WRITE setIfaceMonitor NOTIFY changeSettings )

    Q_PROPERTY( QString colorRX READ getColorRX WRITE setColorRX NOTIFY changeSettings )
    Q_PROPERTY( QString colorTX READ getColorTX WRITE setColorTX NOTIFY changeSettings )

    QNMSettings *qset_here;

    /* основной таймер опроса */
    QTimer timer;
    int timeout;

    QString iface;

    /* временные параметры графика */
    int __timestamp;

    /* размеры графика в ландшафтном режиме */
    int LX_l, LY_l;
    /* размеры графика в портретном режиме */
    int LX_p, LY_p;

    int shiftX, shiftY;
    int lenghtX, lenghtY;

    /* длина графика по Y */
    int Ly;
    /* длина графика по X */
    int Lx;

    /* ширина линии графика */
    int pxLenGraph;

    /* очереди, содержащие данные, отображаемые на графике */
    QQueue<int> viewPointOnGraphRX;
    QQueue<int> viewPointOnGraphTX;
    QQueue<int> viewTimestampMarker;

    /* флаги отображения графиков */
    bool __showRX, __showTX;

    /* тип рисуемого графика */
    enum GraphType {
        GRAPH_STAT_TYPE,
        GRAPH_TIME_TYPE
    };
    GraphType __typeGraph;

    int rx0, tx0, rx1, tx1, X;

    int maxScaleY;
    bool flFistGetTraff;

    /* кисть и шрифт сетки */
    QPen penGrid;
    QFont fontGrid;

    /* кисть и шрифт системы координат */
    QPen penSC;

    /* кисть и шрифт отрисовки интерфейса */
    QPen penIface;
    QFont fontIface;

    QString __speedRX, __speedTX;
    QString __traffRX, __traffTX;

    QString colorStringRX, colorStringTX;

    bool flOnline;

    /* хранит время в секундах с момента запуска */
    int storeTime;

    void firstDataTraf();
    int maxQQueue( const QQueue<int> &queue ) const;

    void drawIface( QPainter* paint );
    void drawSystemCoord( QPainter* paint );
    void drawGrid( QPainter* paint );
    void drawGraph( QPainter* paint );

    QString humanTimestamp( const int timestamp ) const;

public:
    explicit Monitor(QDeclarativeItem *parent = 0);
    virtual void paint(QPainter *paint, const QStyleOptionGraphicsItem *options, QWidget *widget);

    inline int getHeight( ) { return lenghtY; }
    inline void setHeight( const int h ) { lenghtY = h; }

    inline int getWidth( ) { return lenghtX; }
    inline void setWidth( const int w ) { lenghtX = w; }

    inline bool getStatusTimer( ) { return timer.isActive(); }
    inline void setStatusTimer( bool s ) { if(s) { timer.stop(); } else { timer.start(); } }

    inline QString getSpeedRX( ) { return __speedRX; }
    inline void setSpeedRX( const QString &v ) { __speedRX = v; }

    inline QString getSpeedTX( ) { return __speedTX; }
    inline void setSpeedTX( const QString &v ) { __speedTX = v; }

    inline QString getTraffRX( ) { return __traffRX; }
    inline void setTraffRX( const QString &v ) { __traffRX = v; }

    inline QString getTraffTX( ) { return __traffTX; }
    inline void setTraffTX( const QString &v ) { __traffTX = v; }

    inline int getTypeGraph( ) { if( __typeGraph == GRAPH_STAT_TYPE ) return 0; else return 1; }
    inline void setTypeGraph( const int type ) { if(type==0) __typeGraph = GRAPH_STAT_TYPE; else __typeGraph = GRAPH_TIME_TYPE; }

    inline bool getShowRX( ) { return __showRX; }
    inline void setShowRX( const bool w ) { __showRX = w; }

    inline bool getShowTX( ) { return __showTX; }
    inline void setShowTX( const bool w ) { __showTX = w; }

    inline int getTimestamp( ) { return __timestamp; }
    inline void setTimestamp( const int ts ) { __timestamp = ts; }

    inline int getRefreshInt( ) { return timeout; }
    inline void setRefreshInt( const int t ) {
        timeout = t;
        if( timer.isActive() ) {
            timer.stop();
            timer.setInterval( t*1000 );
            timer.start();
        } else {
            timer.setInterval( t*1000 );
        }
    }

    inline QString getIfaceMonitor( ) { return iface; }
    inline void setIfaceMonitor( const QString &_iface ) {
        if( timer.isActive() ) {
            timer.stop();
            iface = _iface;
            timer.start();
        } else {
            iface = _iface;
        }
        flFistGetTraff = true;
    }

    inline QString getColorRX( ) { return colorStringRX; }
    inline void setColorRX( const QString &v ) { colorStringRX = v; emit changeSettings(); }

    inline QString getColorTX( ) { return colorStringTX; }
    inline void setColorTX( const QString &v ) { colorStringTX = v; emit changeSettings(); }

    
signals:
    void changeHeight();
    void changeWidth();
    void changeStatusMonitor();
    void changeValueParam();
    void changeSettings();
    
public slots:
    Q_INVOKABLE void getTraffData();
    Q_INVOKABLE void timerStart();
    Q_INVOKABLE void timerStop();
    Q_INVOKABLE void initSettings();
    Q_INVOKABLE void saveSettings();
    
};

#endif // MONITOR_H
